home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 301-325 / disk_319 / cnewssrc / cnews.src.lzh / libfake / dbm.c next >
C/C++ Source or Header  |  1980-01-01  |  3KB  |  164 lines

  1. /*
  2.  * Incredibly slow Uglix dbm simulation.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7.  
  8. #if 0
  9. # include <sys/stat.h>        /* Why this include??? */
  10. #endif
  11.  
  12. #include "libc.h"
  13.  
  14. #define STRLEN(s) (sizeof (s) - 1)    /* s must be a char array */
  15.  
  16. static char *pagname = NULL;
  17. static FILE *db;
  18. static int dbrdonly;
  19.  
  20. typedef struct {
  21.     char *dptr;
  22.     int dsize;
  23. } datum;
  24.  
  25. dbminit(file)
  26. char *file;
  27. {
  28.     dbrdonly = 0;
  29.  
  30.     if (pagname != NULL)            /* old name? */
  31.         free(pagname);
  32.     pagname = malloc((unsigned)(strlen(file) + STRLEN(".pag") + 1));
  33.     if (pagname == NULL) {
  34.         warning("cannot allocate memory to open database `%s'\n", file);
  35.         return -1;
  36.     }
  37.     (void) strcpy(pagname, file);
  38.     (void) strcat(pagname, ".pag");
  39.  
  40.     if ((db = fopen(pagname, "r+")) == NULL) {
  41.         db = fopen(pagname, "r");
  42.         dbrdonly = 1;
  43.     }
  44.     if (db == NULL) {
  45.         warning("cannot open database `%s'\n", file);
  46.         return -1;
  47.     }
  48.     return 0;
  49. }
  50.  
  51. datum
  52. fetch(key)
  53. datum key;
  54. {
  55.     datum item;
  56.  
  57.     rewind(db);
  58.     while (getitem(&item, db) != EOF)        /* read key */
  59.         if (strncmp(item.dptr, key.dptr, key.dsize) == 0)
  60.             if (getitem(&item, db) == EOF)    /* read data */
  61.                 break;
  62.             else
  63.                 return item;
  64.     /* EOF */
  65.     item.dptr = NULL;
  66.     item.dsize = 0;
  67.     return item;
  68. }
  69.  
  70. delete(key)
  71. datum key;
  72. {
  73.     datum item;
  74.     FILE *temp;
  75.     FILE *tmpfile();
  76.  
  77.     if (dbrdonly)
  78.         return -1;
  79.     temp = tmpfile();
  80.     if (temp == NULL)
  81.         return -1;
  82.     /* copy from db to temp, omitting key & its data */
  83.     rewind(db);
  84.     while (getitem(&item, db) != EOF)
  85.         if (strncmp(item.dptr, key.dptr, key.dsize) == 0) {
  86.             if (getitem(&item, db) == EOF)    /* toss data too */
  87.                 return -1;
  88.         } else
  89.             if (putitem(&item, temp) == EOF)
  90.                 return -1;
  91.     /* copy back from temp to db */
  92.     rewind(temp);
  93.     db = freopen(pagname, "w+", db);
  94.     while (getitem(&item, temp) != EOF)
  95.         if (putitem(&item, db) == EOF)
  96.             return -1;
  97.     return 0;
  98. }
  99.  
  100. store(key, dat)
  101. datum key, dat;
  102. {
  103.     if (dbrdonly)
  104.         return -1;
  105. #ifdef REALDBM            /* else, it's only for news */
  106.     if (delete(key) == -1)
  107.         return -1;
  108. #endif
  109.     if (putitem(&key, db) == EOF || putitem(&dat, db) == EOF)
  110.         return -1;
  111.     return 0;
  112. }
  113.  
  114. datum
  115. firstkey()
  116. {
  117.     datum trash;
  118.     datum nextkey();
  119.  
  120.     rewind(db);
  121.     return nextkey(trash);
  122. }
  123.  
  124. /* ARGSUSED */
  125. datum
  126. nextkey(key)            /* simplistic version, ignores key */
  127. datum key;
  128. {
  129.     static datum dat;
  130.  
  131.     if (getitem(&dat, db) == EOF)
  132.         dat.dptr = NULL;
  133.     return dat;
  134. }
  135.  
  136. static int
  137. getitem(datump, fp)
  138. register datum *datump;            /* points at static storage */
  139. FILE *fp;
  140. {
  141.     static char *data = NULL;    /* the current item */
  142.  
  143.     if (fread((char *)&datump->dsize, sizeof datump->dsize, 1, fp) != 1)
  144.         return EOF;
  145.     if (data != NULL)
  146.         free(data);        /* pitch old item */
  147.     datump->dptr = data = malloc((unsigned)datump->dsize);
  148.     if (data == NULL ||
  149.         fread(datump->dptr, datump->dsize, 1, fp) != 1)
  150.         return EOF;
  151.     return 0;
  152. }
  153.  
  154. static int
  155. putitem(datump, fp)
  156. datum *datump;
  157. FILE *fp;
  158. {
  159.     if (fwrite((char *)&datump->dsize, sizeof datump->dsize, 1, fp) != 1 ||
  160.         fwrite(datump->dptr, datump->dsize, 1, fp) != 1)
  161.         return EOF;
  162.     return 0;
  163. }
  164.